package cn.itcast.gateway;

import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.cloud.gateway.filter.GlobalFilter;
import org.springframework.core.annotation.Order;
import org.springframework.http.HttpStatus;
import org.springframework.http.server.reactive.ServerHttpRequest;
import org.springframework.stereotype.Component;
import org.springframework.util.MultiValueMap;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;

import java.lang.annotation.Annotation;

//@Order(-1) //顺序注解,过滤器的顺序。值越低越优先
@Component  //将类注入到spring当中,作为一个Bean
public class AuthorizaFilter implements GlobalFilter ,Order{
    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        //1.获取请求参数 。通过上下文获取请求,拿到request对象
        ServerHttpRequest request = exchange.getRequest();
        // 1.1获取请求参数。 查询参数，返回的是map。 k是参数名称，v就是对应的值
        MultiValueMap<String, String> queryParams = request.getQueryParams();
        //2.获取参数当中的 Authorization参数.因为要判断请求参数Authorization.
        String auth = queryParams.getFirst("authorization");
        //3.判断参数值是否等于 admin .那admin当用用户名
        if("admin".equals(auth)){
            // 4.相等则放行。
            // 当调用filter那一刻，其实是从过滤器链(GatewayFilterChain)里面，
            // 找到下一个过滤器,再调取下一个过滤器方法。就等于放行了
            return  chain.filter(exchange);
        }
        //5.拦截：通过exchange得到response，然后setComplete（设置结束）
        // 5.1设置状态码，拦截请求.  401= UNAUTHORIZED
        exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);
        return exchange.getResponse().setComplete();
    }
    // 设置过滤器优先级，值越低优先级越高
    // 也可以使用 @Order 注解
    @Override
    public int value() {
        return -1;
    }

    @Override
    public Class<? extends Annotation> annotationType() {
        return null;
    }
}
